/***********************************************
公司：东莞市微宏智能科技有限公司
品牌：WHEELTEC
官网：wheeltec.net
淘宝店铺：shop114407458.taobao.com
速卖通: https://minibalance.aliexpress.com/store/4455017
版本：5.7
修改时间：2021-04-29

Company: WeiHong Co.Ltd
Brand: WHEELTEC
Website: wheeltec.net
Taobao shop: shop114407458.taobao.com
Aliexpress: https://minibalance.aliexpress.com/store/4455017
Version:5.7
Update：2021-04-29

All rights reserved
***********************************************/
#include "adc.h"

/**************************************************************************
Function: Initialize the ADC
Input   : none
Output  : none
函数功能：ACD初始化电池电压检测
入口参数: 无
返回  值：无
**************************************************************************/
void Adc_Init(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);  // 使能ADC1通道时钟
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                            // 设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    // 设置模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  // 模拟输入引脚
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    ADC_DeInit(ADC1);                                                    // 复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                   // ADC工作模式:ADC1和ADC2工作在独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;                        // 模数转换工作在单通道模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                  // 模数转换工作在单次转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  // 转换由软件而不是外部触发启动
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;               // ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;                              // 顺序进行规则转换的ADC通道的数目
    ADC_Init(ADC1, &ADC_InitStructure);                                  // 根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
    ADC_Cmd(ADC1, ENABLE);                                               // 使能指定的ADC1
    ADC_ResetCalibration(ADC1);                                          // 使能复位校准
    while (ADC_GetResetCalibrationStatus(ADC1));                         // 等待复位校准结束
    ADC_StartCalibration(ADC1);                                          // 开启AD校准
    while (ADC_GetCalibrationStatus(ADC1));                              // 等待校准结束
}

/**************************************************************************
Function: AD sampling
Input   : ch：Channel of ADC1
Output  : AD conversion result
函数功能：AD采样
入口参数: ch：ADC1 的通道
返回  值：AD转换结果
**************************************************************************/
u16 Get_Adc(u8 ch)
{
    // 设置指定ADC的规则组通道，一个序列，采样时间
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);  // ADC1,ADC通道,采样时间为239.5周期
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);                            // 使能指定的ADC1的软件转换启动功能
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));                    // 等待转换结束
    return ADC_GetConversionValue(ADC1);                               // 返回最近一次ADC1规则组的转换结果
}

/**************************************************************************
Function: Read battery voltage
Input   : none
Output  : Battery voltage（MV）
函数功能：读取电池电压
入口参数: 无
返回  值：电池电压 单位MV
**************************************************************************/
int Get_battery_volt(void)
{
    int Volt;                                            // 电池电压
    Volt = Get_Adc(Battery_Ch) * 3.3 * 11 * 100 / 4096;  // 电阻分压，具体根据原理图简单分析可以得到
    return Volt;
}
